home *** CD-ROM | disk | FTP | other *** search
/ Magnum One / Magnum One (Mid-American Digital) (Disc Manufacturing).iso / d12 / multi_v.arc / DRIVER.ASM next >
Assembly Source File  |  1988-04-19  |  12KB  |  423 lines

  1. page 66,132
  2. ; *****************************************************
  3. ; *                       PROLOG                      *
  4. ; * This is an installable device driver for an       *
  5. ; * in storage diskette (virtual) with 180K capacity. *
  6. ; *****************************************************
  7. ;
  8. CSEG      SEGMENT PARA PUBLIC 'CODE'
  9. ;
  10. ;         M A C R O ( S )
  11. ;
  12. STATUS  MACRO    STATE,ERR,RC
  13.         IFIDN    <STATE>,<DONE>
  14.          OR       ES:WORD PTR SRH_STA_FLD[BX],0100H
  15.         ENDIF
  16.         IFIDN    <STATE>,<BUSY>
  17.          OR       ES:WORD PTR SRH_STA_FLD[BX],0200H
  18.         ENDIF
  19.         IFIDN    <ERR>,<ERROR>
  20.          OR       ES:WORD PTR SRH_STA_FLD[BX],1000H
  21.         ENDIF
  22.         IFNB     <RC>
  23.          OR       ES:WORD PTR SRH_STA_FLD[BX],RC
  24.         ENDIF
  25.         ENDM
  26. ;
  27. ;        E Q U A T E S
  28. ;
  29. ; READ/WRITE
  30. ;
  31. SRH             EQU       0                 ;
  32. SRH_LEN         EQU       13                ;
  33. SRH_LEN_FLD     EQU       SRH               ;
  34. SRH_UCD_FLD     EQU       SRH+1             ;
  35. SRH_CCD_FLD     EQU       SRH+2             ;
  36. SRH_STA_FLD     EQU       SRH+3             ;
  37. SRH_RES_FLD     EQU       SRH+5             ;
  38. ;
  39. MD              EQU       SRH+SRH_LEN       ;
  40. MD_LEN          EQU       1                 ;
  41. DTA             EQU       MD+MD_LEN         ;
  42. DTA_LEN         EQU       4                 ;
  43. COUNT           EQU       DTA+DTA_LEN       ;
  44. COUNT_LEN       EQU       2                 ;
  45. SSN             EQU       COUNT+COUNT_LEN   ;
  46. SSN_LEN         EQU       2                 ;
  47. ;
  48. ; MEDIA CHECK
  49. ;
  50. RET_BYTE        EQU       MD+MD_LEN         ;
  51. ;
  52. ; BUILD BPB
  53. ;
  54. BPBA_PTR        EQU       DTA+DTA_LEN       ;
  55. BPBA_PTR_LEN    EQU       4                 ;
  56. ;
  57. ; INIT
  58. ;
  59. UNITS           EQU       SRH+SRH_LEN
  60. UNITS_LEN       EQU       1
  61. BR_ADDR_0       EQU       UNITS+UNITS_LEN
  62. BR_ADDR_1       EQU       BR_ADDR_0+2
  63. BR_ADDR_LEN     EQU       4
  64. BPB_PTR_OFF     EQU       BR_ADDR_0+BR_ADDR_LEN
  65. BPB_PTR_SEG     EQU       BPB_PTR_OFF+2
  66. ;
  67. ;
  68. VDSK     PROC      FAR
  69.          ASSUME    CS:CSEG,ES:CSEG,DS:CSEG
  70. BEGIN:
  71. START           EQU       $
  72. ;           S P E C I A L    D E V I C E    H E A D E R
  73. NEXT_DEV        DD        -1                ;
  74. ATTRIBUTE       DW        2000H             ;
  75. STRATEGY        DW        DEV_STRATEGY      ;
  76. INTERRUPT       DW        DEV_INT           ;
  77. DEV_NAME        DB        3                 ;
  78.                 DB        7 DUP(?)          ;
  79. ;
  80. RH_OFF          DW        ?                 ;
  81. RH_SEG          DW        ?                 ;
  82. ;  BIOS PARAMETER BLOCK
  83. BPB             EQU       $                 ;
  84. SEC_SIZE        DW        512               ;
  85.                 DB        1                 ;
  86.                 DW        1                 ;
  87.                 DB        1                 ;
  88.                 DW        32                ;
  89. NUM_SEC         DW        127               ; NOTE - must be less than 128
  90.                 DB        0FCH              ; or arithmetic overflows.
  91.                 DW        1                 ;
  92. ;
  93. BPB_PTR         DW        BPB               ;
  94.                 DW        BPB               ;
  95.                 DW        BPB               ;
  96. ;  CURRENT VIRTUAL DISK INFORMATION
  97. TOTAL           DW        ?                 ;
  98. VERIFY          DB        0                 ;
  99. START_SEC       DW        0                 ;
  100. VDISK_PTR       DW        0                 ;
  101. USER_DTA        DD        ?                 ;
  102. BOOT_REC        EQU       $                 ;
  103.                 DB        3 DUP(0)          ;
  104.                 DB        'IBM  2.0'        ;
  105.                 DW        512               ;sector size
  106.                 DB        1                 ;sectors per allocation unit
  107.                 DW        1                 ;reserved sectors
  108.                 DB        1                 ;FATS
  109.                 DW        32                ;directory entries
  110.                 DW        127               ;total sectors in image 127 tops
  111.                 DB        0FCH              ;single sided 9 sector
  112.                 DW        1                 ;sectors in FAT
  113. ;
  114. ;      FUNCTION TABLE
  115. ;
  116. FUNTAB          LABEL     BYTE              ;
  117.                 DW        INIT              ;
  118.                 DW        MEDIA_CHECK       ;
  119.                 DW        BUILD_BPB         ;
  120.                 DW        IOCTL_IN          ;
  121.                 DW        INPUT             ;
  122.                 DW        ND_INPUT          ;
  123.                 DW        IN_STAT           ;
  124.                 DW        IN_FLUSH          ;
  125.                 DW        OUTPUT            ;
  126.                 DW        OUT_VERIFY         ;
  127.                 DW        OUT_FLUSH         ;
  128.                 DW        IOCTL_OUT         ;
  129. ;
  130. ; L O C A L    P R O C E D U R E S
  131. ;
  132. IN_SAVE  PROC      NEAR
  133.          MOV       AX,ES:WORD PTR DTA[BX]
  134.          MOV       CS:USER_DTA,AX
  135.          MOV       AX,ES:WORD PTR DTA+2[BX]
  136.          MOV       CS:USER_DTA+2,AX
  137.          MOV       AX,ES:WORD PTR COUNT[BX]
  138.          XOR       AH,AH
  139.          MOV       CS:TOTAL,AX
  140.          RET
  141. IN_SAVE ENDP
  142. ;
  143. CALC_ADDR PROC NEAR
  144.          MOV       AX,CS:START_SEC
  145.          MOV       CX,20H
  146.          MUL       CX
  147.          MOV       DX,CS:VDISK_PTR
  148.          ADD       DX,AX
  149.          MOV       DS,DX
  150.          XOR       SI,SI
  151.          MOV       AX,CS:TOTAL
  152.          MOV       CX,512
  153.          MUL       CX
  154.          OR        AX,AX
  155.          JNZ       MOVE_IT
  156.          MOV       AX,0FFFFH
  157. MOVE_IT:
  158.          XCHG CX,AX
  159.          RET
  160. CALC_ADDR ENDP
  161. ;
  162. SECTOR_READ PROC NEAR
  163.          CALL      CALC_ADDR
  164.          MOV       ES,CS:USER_DTA+2
  165.          MOV       DI,CS:USER_DTA
  166. ;
  167. ; CHECK FOR DTA WRAP IN CASE WE CAME THROUGH VIA VERIFY
  168. ;
  169.          MOV       AX,DI
  170.          ADD       AX,CX
  171.          JNC       READ_COPY
  172.          MOV       AX,0FFFFH
  173.          SUB       AX,DI
  174.          MOV       CX,AX
  175. READ_COPY:
  176. REP      MOVSB
  177.          RET
  178. SECTOR_READ ENDP
  179. ;
  180. SECTOR_WRITE PROC NEAR
  181.          CALL      CALC_ADDR
  182.          PUSH      DS
  183.          POP       ES
  184.          MOV       DI,SI
  185.          MOV       DS,CS:USER_DTA+2
  186.          MOV       SI,CS:USER_DTA
  187. ;
  188. ; CHECK FOR DTA WRAP
  189. ;
  190.          MOV       AX,SI
  191.          ADD       AX,CX
  192.          JNC       WRITE_COPY
  193.          MOV       AX,0FFFFH
  194.          SUB       AX,SI
  195.          MOV       CX,AX
  196. WRITE_COPY:
  197. REP      MOVSB
  198.          RET
  199. SECTOR_WRITE ENDP
  200. ;
  201. ; D E V I C E    S T R A T E G Y
  202. ;
  203. DEV_STRATEGY:
  204.          MOV       CS:RH_SEG,ES
  205.          MOV       CS:RH_OFF,BX
  206.          RET
  207. ;
  208. ; D E V I C E    I N T E R R U P T    H A N D L E R
  209. ;
  210. DEV_INT:
  211. ;
  212.          CLD
  213.          PUSH      DS
  214.          PUSH      ES
  215.          PUSH      AX
  216.          PUSH      BX
  217.          PUSH      CX
  218.          PUSH      DX
  219.          PUSH      DI
  220.          PUSH      SI
  221. ;
  222. ;
  223. ; DO THE BRANCH ACCORDING TO THE FUNCTION PASSED
  224. ;
  225.          MOV       AL,ES:[BX]+2
  226.          ROL       AL,1
  227.          LEA       DI,FUNTAB
  228.          XOR       AH,AH
  229.          ADD       DI,AX
  230.          JMP       WORD PTR[DI]
  231. ;
  232. ; INIT
  233. ;
  234. INIT:
  235.          PUSH      CS
  236.          POP       DX
  237.          LEA       AX,CS:VDISK
  238.          MOV       CL,4
  239.          ROR       AX,CL
  240.          ADD       DX,AX
  241.          MOV       CS:VDISK_PTR,DX
  242. ;
  243.          PUSH      DX
  244.          PUSH      CX
  245.          MOV       AX,CS:SEC_SIZE
  246.          MUL       CS:NUM_SEC           ; this limits us to 64kb disks
  247.          MOV       CL,4
  248.          SHR       AX,CL
  249.          POP       CX
  250.          POP       DX
  251. ;
  252.          ADD       DX,AX
  253.          MOV       ES:WORD PTR BR_ADDR_0[BX],0
  254.          MOV       ES:BR_ADDR_1[BX],DX
  255. ;
  256. ;       find the number of disks on the machine and adjust
  257. ;       "units" to make ram disks end with E:.
  258.  
  259.          PUSH      AX
  260.          PUSH      DX
  261.          MOV       DL,0
  262.          MOV       AH,0EH
  263.          INT       21H          ;AL returns number of logical drives in system.
  264.          MOV       AH,5         ; put desired last vdisk in AH, A: = 1.
  265.          SUB       AH,AL
  266.          POP       DX
  267.          MOV       ES:BYTE PTR UNITS[BX],AH
  268.          POP       AX
  269. ;
  270.          LEA       DX,BPB_PTR
  271.          MOV       ES:BPB_PTR_OFF[BX],DX
  272.          MOV       ES:BPB_PTR_SEG[BX],CS
  273.          MOV       ES,CS:VDISK_PTR
  274.          XOR       DI,DI
  275.          LEA       SI,BOOT_REC
  276.          MOV       CX,24
  277.          REP       MOVSB
  278.          MOV       CS:WORD PTR START_SEC,1
  279.          MOV       CS:WORD PTR TOTAL,2
  280.          CALL      CALC_ADDR
  281.          PUSH      DS
  282.          POP       ES
  283.          MOV       DI,SI
  284.          XOR       AL,AL
  285. REP      STOSB
  286.          MOV       DS:BYTE PTR [SI],0FCH
  287.          MOV       DS:BYTE PTR 1[SI],0FFH
  288.          MOV       DS:BYTE PTR 2[SI],0FFH
  289.          PUSH      DS
  290.          PUSH      SI
  291.          MOV       CS:WORD PTR START_SEC,3
  292.          MOV       CS:WORD PTR TOTAL,2
  293.          CALL      CALC_ADDR
  294.          PUSH      DS
  295.          POP       ES
  296.          MOV       DI,SI
  297.          POP       SI
  298.          POP       DS
  299.          REP       MOVSB
  300.          MOV       CS:WORD PTR START_SEC,5
  301.          MOV       CS:WORD PTR TOTAL,4
  302.          CALL      CALC_ADDR
  303.          XOR       AL, AL
  304.          PUSH      DS
  305.          POP       ES
  306.          XOR       DI,DI
  307. REP      STOSB
  308.          MOV       ES,CS:RH_SEG
  309.          MOV       BX,CS:RH_OFF
  310.          STATUS    DONE,NOERROR,0
  311.            OR        ES:WORD PTR SRH_STA_FLD[BX],0100H
  312.            OR        ES:WORD PTR SRH_STA_FLD[BX],0
  313.          JMP       EXIT
  314. ;
  315. ; MEDIA CHECK
  316. ;
  317. MEDIA_CHECK:
  318.          MOV       ES:BYTE PTR RET_BYTE[BX],1
  319.          STATUS    DONE,NOERROR,0
  320.            OR        ES:WORD PTR SRH_STA_FLD[BX],0100H
  321.            OR        ES:WORD PTR SRH_STA_FLD[BX],0
  322.          JMP EXIT
  323. ; BUILD BIOS PARAMETER BLOCK
  324. ;
  325. BUILD_BPB:
  326.          PUSH      ES
  327.          PUSH      BX
  328.          MOV       CS:WORD PTR START_SEC,0
  329.          MOV       CS:WORD PTR TOTAL,1
  330.          CALL      CALC_ADDR
  331.          PUSH      CS
  332.          POP       ES
  333.          LEA       DI,BPB
  334.          ADD       SI,11
  335.          MOV       CX,13
  336. REP      MOVSB
  337.          POP       BX
  338.          POP       ES
  339.          LEA       DX,BPB
  340.          MOV       ES:BPBA_PTR[BX],DX
  341.          MOV       ES:BPBA_PTR+2[BX],CS
  342.          MOV       ES:DTA[BX],DX
  343.          MOV       ES:DTA+2[BX],CS
  344.          STATUS    DONE,NOERROR,0
  345.            OR        ES:WORD PTR SRH_STA_FLD[BX],0100H
  346.            OR        ES:WORD PTR SRH_STA_FLD[BX],0
  347.          JMP       EXIT
  348. ;
  349. ; THE FOLLOWING ENTRIES ARE FOR NOT SUPPORTED BY THIS DEVICE
  350. ;
  351. IOCTL_IN:
  352. IOCTL_OUT:
  353. ND_INPUT:
  354. IN_STAT:
  355. IN_FLUSH:
  356. OUT_STAT:
  357. OUT_FLUSH:
  358. ;
  359. ; DISK READ
  360. ;
  361. INPUT:
  362.  
  363.          CALL      IN_SAVE
  364.          MOV       AX,ES:WORD PTR SSN[BX]
  365.          MOV       CS:START_SEC,AX
  366.          MOV       AX,ES:WORD PTR COUNT[BX]
  367.          MOV       CS:TOTAL,AX
  368.          CALL      SECTOR_READ
  369.          MOV       BX,CS:RH_OFF
  370.          MOV       ES,CS:RH_SEG
  371.          STATUS    DONE,NOERROR,0
  372.            OR        ES:WORD PTR SRH_STA_FLD[BX],0100H
  373.            OR        ES:WORD PTR SRH_STA_FLD[BX],0
  374.  
  375.          JMP       EXIT
  376. ;
  377. ; DISK WRITE
  378. ;
  379. OUTPUT:
  380.          CALL      IN_SAVE
  381.          MOV       AX,ES:WORD PTR SSN[BX]
  382.          MOV       CS:START_SEC,AX
  383.          MOV       AX,ES:WORD PTR COUNT[BX]
  384.          MOV       CS:TOTAL,AX
  385.          CALL      SECTOR_WRITE
  386.          MOV       BX,CS:RH_OFF
  387.          MOV       ES,CS:RH_SEG
  388.          CMP       CS:BYTE PTR VERIFY,0
  389.          JZ        NO_VERIFY
  390.          MOV       CS:BYTE PTR VERIFY,0
  391.          JMP       INPUT
  392. NO_VERIFY:
  393.          STATUS    DONE,NOERROR,0
  394.            OR        ES:WORD PTR SRH_STA_FLD[BX],0100H
  395.            OR        ES:WORD PTR SRH_STA_FLD[BX],0
  396.          JMP       EXIT
  397. OUT_VERIFY:
  398.          MOV       CS:BYTE PTR VERIFY,1
  399.          JMP       OUTPUT
  400. ;
  401. ; COMMON EXIT
  402. ;
  403. EXIT:
  404.          POP       SI
  405.          POP       DI
  406.          POP       DX
  407.          POP       CX
  408.          POP       BX
  409.          POP       AX
  410.          POP       ES
  411.          POP       DS
  412.          RET
  413. E_O_P:
  414. ; MACRO TO ALIGN THE VIRTUAL DISK ON A PARAGRAPH BOUNDRY
  415.          if ($-START) MOD 16
  416.               ORG       ($-START)+16-(($-START) MOD 16)
  417.          endif
  418. VDISK     EQU $
  419. VDSK ENDP
  420. CSEG ENDS
  421. END BEGIN
  422. 
  423.